JNI-Inject 注入与反调试

[TOC]

Inject 流程(Win的调试器注入流程):

  1. 附加指定进程
  2. 系统调用断点(断在API调用)
  3. 保存寄存器环境
  4. 申请内存
  5. 写入代码
  6. 修改PC寄存器的值为注入代码的地址
  7. 在注入代码中恢复寄存器环境
  8. 取消调试器附加

实现:无线程,注入二进制代码


反调试原理:

调试器占用:
原理:因为一个程序,在同一时间,只能被一个调试器调试(附加).

所以APP本身可以使用函数:ptrace(PTRACE_TRACEME, getpid(), 0, 0);, 自己占用自己的调试端口, 实现无需ROOT反调试

PTRACE_TRACEME: 指定自己为调试器 附加自己的进程, 进而占用自己的调试端口

查看进程信息达到反调试
原理:程序在被调试状态,会给proc/self/status文件的TracerPid字段置位

开启线程,专职读取proc/self/status文件的TracerPid字段,查看调试状态,发现被调试,则结束程序

反 反调试:

调试器占用

打文件补丁:查看ptrace的引用,在程序空间NOP掉本条指令
动态补丁:在调用时返回或修改参数

查看进程信息达到反调试

对系统API: open下断点, R0寄存器指向文件路径, 判断程序读取是否为proc/self/status文件, 如果是,则直接返回错误值,或栈回溯到程序空间处理代码


JNI 内联汇编

__asm__ { "ARM OPCODE"} //内联汇编, 汇编指令都是以字符串的方式内联

裸函数:

1
2
3
4
__attribute__ ((nake)) RetArg FunName(ArgList)
{
return nRet;
}
文章目录
  1. 1. Inject 流程(Win的调试器注入流程):
  2. 2. 反调试原理:
  3. 3. 反 反调试:
  4. 4. JNI 内联汇编
|